/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tablero;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 *
 * @author Joshua
 */
public class Coordenadas extends MouseAdapter {

    Tablero ventanaReferencia;
    Movimientos Mov = new Movimientos();
    private Boolean Fichasel = false;
    private int Xant;
    private int Yant;
    private Boolean movespecial = false;

    Coordenadas(Tablero Tablero) {
        ventanaReferencia = Tablero;
    }

    public void mousePressed(MouseEvent Evento) {
        if (20 < Evento.getX() && Evento.getX() < 580 && 125 < Evento.getY() && Evento.getY() < 685) {
            if (!Fichasel) {
                Xant = (Evento.getX()-20) / 70;
                Yant = (Evento.getY()-125) / 70;
                System.out.println(Evento.getX() +" "+ Evento.getY());
                if ((ventanaReferencia.Tablero[Yant][Xant]) != null && (ventanaReferencia.Tablero[Yant][Xant]).color.equals(ventanaReferencia._Accion)) {
                    System.out.println("selecciono: " + (ventanaReferencia.Tablero[Yant][Xant]).tipo);
                    Fichasel = true;
                }
            } else {
                int X = (Evento.getX()-20) / 70;
                int Y = (Evento.getY()-125) / 70;
                if (!(X == Xant && Y == Yant)) {
                    String tipo = ventanaReferencia.Tablero[Yant][Xant].tipo;
                    String color = ventanaReferencia.Tablero[Yant][Xant].color;
                    if (tipo.equals("r") && ventanaReferencia.Tablero[Y][X] != null && ventanaReferencia.Tablero[Y][X].tipo.equals("t")
                            && !ventanaReferencia.Tablero[Y][X].movida && !ventanaReferencia.Tablero[Yant][Xant].movida) {
                        if (X < Xant) {
                            //Enroque largo
                            movespecial = true;
                            for (int i = 0; i < Xant - X - 1; i++) {
                                if (ventanaReferencia.Tablero[Y][X + i + 1] != null) {
                                    movespecial = false;
                                }
                            }
                            if (movespecial) {
                                movespecial = false;
                                System.out.println("Revisando jaque1");
                                if (!revisarjaque()) {
                                    ventanaReferencia.Tablero[Y][Xant - 2] = new Ficha(tipo + color);
                                    ventanaReferencia.Tablero[Y][Xant - 2].setmovida();
                                    ventanaReferencia.Tablero[Yant][Xant] = null;
                                    ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, Xant - 2, Y);
                                    ventanaReferencia.AgregarImagen("Imagenes/", Xant, Yant);
                                    ventanaReferencia.Tablero[Y][Xant - 1] = new Ficha("t" + color);
                                    ventanaReferencia.Tablero[Y][Xant - 1].setmovida();
                                    ventanaReferencia.Tablero[Y][X] = null;
                                    ventanaReferencia.AgregarImagen("Imagenes/" + "t" + color, Xant - 1, Y);
                                    ventanaReferencia.AgregarImagen("Imagenes/", X, Y);
                                    Fichasel = false;
                                    System.out.println("Revisando jaque2");
                                    if (revisarjaque()) {
                                        System.out.println("Su ficha esta en jaque");
                                        ventanaReferencia.Tablero[Yant][Xant] = new Ficha(tipo + color);
                                        ventanaReferencia.Tablero[Y][X] = new Ficha("t" + color);
                                        ventanaReferencia.Tablero[Y][Xant - 2] = null;
                                        ventanaReferencia.Tablero[Y][Xant - 1] = null;
                                        ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, Xant, Yant);
                                        ventanaReferencia.AgregarImagen("Imagenes/", Xant - 2, Y);
                                        ventanaReferencia.AgregarImagen("Imagenes/" + "t" + color, X, Y);
                                        ventanaReferencia.AgregarImagen("Imagenes/", Xant - 1, Y);
                                    } else if (ventanaReferencia._Accion.equals("b")) {
                                        ventanaReferencia._Accion = "n";
                                    } else {
                                        ventanaReferencia._Accion = "b";
                                    }
                                }else {
                                    System.out.println("Su ficha esta en jaque3");
                                }
                            }
                        } else {
                            //Enroque corto
                            movespecial = true;
                            for (int i = 0; i < X - Xant - 1; i++) {
                                if (ventanaReferencia.Tablero[Y][Xant + i + 1] != null) {
                                    movespecial = false;
                                }
                            }
                            if (movespecial) {
                                movespecial = false;
                                if (!revisarjaque()) {
                                    ventanaReferencia.Tablero[Y][Xant + 2] = new Ficha(tipo + color);
                                    ventanaReferencia.Tablero[Y][Xant + 2].setmovida();
                                    ventanaReferencia.Tablero[Yant][Xant] = null;
                                    ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, Xant + 2, Y);
                                    ventanaReferencia.AgregarImagen("Imagenes/", Xant, Yant);
                                    ventanaReferencia.Tablero[Y][Xant + 1] = new Ficha("t" + color);
                                    ventanaReferencia.Tablero[Y][Xant + 1].setmovida();
                                    ventanaReferencia.Tablero[Y][X] = null;
                                    ventanaReferencia.AgregarImagen("Imagenes/" + "t" + color, Xant + 1, Y);
                                    ventanaReferencia.AgregarImagen("Imagenes/", X, Y);
                                    Fichasel = false;
                                    System.out.println("Revisando jaque");
                                    if (revisarjaque()) {
                                        System.out.println("Su ficha esta en jaque4");
                                        ventanaReferencia.Tablero[Yant][Xant] = new Ficha(tipo + color);
                                        ventanaReferencia.Tablero[Y][X] = new Ficha("t" + color);
                                        ventanaReferencia.Tablero[Y][Xant + 2] = null;
                                        ventanaReferencia.Tablero[Y][Xant + 1] = null;
                                        ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, Xant, Yant);
                                        ventanaReferencia.AgregarImagen("Imagenes/", Xant + 2, Y);
                                        ventanaReferencia.AgregarImagen("Imagenes/" + "t" + color, X, Y);
                                        ventanaReferencia.AgregarImagen("Imagenes/", Xant + 1, Y);
                                    } else if (ventanaReferencia._Accion.equals("b")) {
                                        ventanaReferencia._Accion = "n";
                                    } else {
                                        ventanaReferencia._Accion = "b";
                                    }
                                }else {
                                    System.out.println("Su ficha esta en jaque5");
                                }
                            }
                        }
                    } else if ((ventanaReferencia.Tablero[Y][X]) != null && (ventanaReferencia.Tablero[Y][X]).color.equals(ventanaReferencia._Accion)) {
                        // Solamente cambia de ficha
                        Xant = (Evento.getX()) / 70;
                        Yant = (Evento.getY()) / 70;
                        System.out.println("selecciono: " + (ventanaReferencia.Tablero[Yant][Xant]).tipo);
                    } else if (ventanaReferencia.Tablero[Y][X] != null
                            && ventanaReferencia.Tablero[Y][X].tipo.equals("r")) {
                        Fichasel = false;
                    } else if (Mov.movimientos(tipo, color, X, Y, Xant, Yant, ventanaReferencia.Tablero)) {
                        Ficha temp1 = null;
                        if (tipo.equals("p")) {
                            //Peon come al paso
                            if (ventanaReferencia.Tablero[Y][X] == null
                                    && !ventanaReferencia.Tablero[Yant][X].tipo.equals("r")) {
                                temp1 = new Ficha(ventanaReferencia.Tablero[Yant][X].tipo
                                        + ventanaReferencia.Tablero[Yant][X].color);
                                ventanaReferencia.AgregarImagen("Imagenes/", X, Yant);
                                ventanaReferencia.Tablero[Yant][X] = null;
                            }
                        }
                        Ficha temp2 = null;
                        if (ventanaReferencia.Tablero[Y][X] != null) {
                            temp2 = new Ficha(ventanaReferencia.Tablero[Y][X].tipo
                                    + ventanaReferencia.Tablero[Y][X].color);
                        }
                        if (ventanaReferencia.Tablero[Y][X] == null && tipo.equals("p")
                                && ventanaReferencia.Tablero[Yant][X] != null
                                && ventanaReferencia.Tablero[Yant][X].tipo.equals("r")
                                && !ventanaReferencia.Tablero[Yant][X].color.equals(color)) {
                            Fichasel = false;
                        } else {
                            ventanaReferencia.Tablero[Y][X] = new Ficha(tipo + color);
                            ventanaReferencia.Tablero[Y][X].setmovida();
                            ventanaReferencia.Tablero[Yant][Xant] = null;
                            ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, X, Y);
                            ventanaReferencia.AgregarImagen("Imagenes/", Xant, Yant);
                            Fichasel = false;
                            System.out.println("Revisando jaque");
                            if (revisarjaque()) {
                                System.out.println("Su ficha esta en jaque6");
                                if (temp1 != null) {
                                    ventanaReferencia.Tablero[Yant][X] = new Ficha(temp1.tipo
                                            + temp1.color);
                                    ventanaReferencia.AgregarImagen("Imagenes/" + temp1.tipo + temp1.color, X, Yant);
                                    ventanaReferencia.Tablero[Yant][X].setmovida();
                                }
                                ventanaReferencia.Tablero[Y][X] = null;
                                ventanaReferencia.AgregarImagen("Imagenes/", X, Y);
                                if (temp2 != null) {
                                    ventanaReferencia.Tablero[Y][X] = new Ficha(temp2.tipo
                                            + temp2.color);
                                    ventanaReferencia.AgregarImagen("Imagenes/" + temp2.tipo + temp2.color, X, Y);
                                    ventanaReferencia.Tablero[Y][X].setmovida();
                                }
                                ventanaReferencia.Tablero[Yant][Xant] = new Ficha(tipo + color);
                                ventanaReferencia.Tablero[Yant][Xant].setmovida();
                                ventanaReferencia.AgregarImagen("Imagenes/" + tipo + color, Xant, Yant);
                                if (revisarjaquemate()) {
                                    System.out.println("Partida finalizada");
                                }
                            }
                            else if (ventanaReferencia._Accion.equals("b")) {
                                ventanaReferencia._Accion = "n";
                            } else {
                                ventanaReferencia._Accion = "b";
                            }
                        }
                    }
                } else {
                    System.out.println("ficha igual");
                    Fichasel = false;
                }
                String salida = "";
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        if (ventanaReferencia.Tablero[i][j] != null) {
                            salida += ventanaReferencia.Tablero[i][j].tipo + ventanaReferencia.Tablero[i][j].color + " ";
                        } else {
                            salida += "   ";
                        }
                    }
                    salida += "\n";
                }
                System.out.println(salida);
            }
        } else {
            Fichasel = false;
        }
    }

    private Boolean revisarjaque() {
        int x = 0;
        int y = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (ventanaReferencia.Tablero[i][j] != null
                        && ventanaReferencia.Tablero[i][j].tipo.equals("r")
                        && ventanaReferencia.Tablero[i][j].color.equals(ventanaReferencia._Accion)) {
                    y = i;
                    x = j;
                    break;
                }
            }
        }
        return (Mov.jaque(ventanaReferencia._Accion, x, y, ventanaReferencia.Tablero));
    }

    public Boolean revisarjaquemate() {
        int y = 0;
        int x = 0;
        Boolean valor = true;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (ventanaReferencia.Tablero[i][j] != null
                        && ventanaReferencia.Tablero[i][j].tipo.equals("r")
                        && ventanaReferencia.Tablero[i][j].color.equals(ventanaReferencia._Accion)) {
                    y = i;
                    x = j;
                    break;
                }
            }
        }
        ventanaReferencia.Tablero[y][x] = null;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (y + i - 1 >= 0 && y + i - 1 < 8 && x + j - 1 >= 0 && x + j - 1 < 8) {
                    if (ventanaReferencia.Tablero[y + i - 1][x + j - 1] == null) {
                        ventanaReferencia.Tablero[y + i - 1][x + j - 1] = new Ficha("r" + ventanaReferencia._Accion);
                        if (!(Mov.jaque(ventanaReferencia._Accion, x + j - 1, y + i - 1, ventanaReferencia.Tablero))) {
                            valor = false;
                            System.out.println("no hay mate");
                        }
                        ventanaReferencia.Tablero[y + i - 1][x + j - 1] = null;
                    }
                }
            }
        }
        ventanaReferencia.Tablero[y][x] = new Ficha("r" + ventanaReferencia._Accion);
        if (valor) {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (ventanaReferencia.Tablero[i][j] != null && !ventanaReferencia.Tablero[i][j].color.equals(ventanaReferencia._Accion)) {
                        if (Mov.movimientos(ventanaReferencia.Tablero[i][j].tipo, ventanaReferencia.Tablero[i][j].color, x, y, j, i, ventanaReferencia.Tablero)){
                            System.out.println("puede ser atacado el rey");
                            for (int w = 0; w < 8; w++) {
                                for (int z = 0; z < 8; z++) {
                                    if (ventanaReferencia.Tablero[w][z] != null && ventanaReferencia.Tablero[w][z].color.equals(ventanaReferencia._Accion)) {
                                        System.out.println(ventanaReferencia.Tablero[i][j].tipo+ ventanaReferencia.Tablero[i][j].color+i+j);
                                        System.out.println(ventanaReferencia.Tablero[w][z].tipo+ ventanaReferencia.Tablero[w][z].color+w+z);
                                        if (Mov.movimientos(ventanaReferencia.Tablero[w][z].tipo, ventanaReferencia.Tablero[w][z].color, j, i, z, w, ventanaReferencia.Tablero)) {
                                            valor = false;
                                            System.out.println("puede ser aniquilada");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return valor;
    }
}